; These routines emulate a push-all of the ; registers and segregs before an interrupt ; is executed, and then pop them in the ; same order. ; Note: cpopt is used for testing so we use ; a ret instead of a iret. TITLE REGISTER MANIPULATION ROUTINES SUBTTL Copyright 1986 by Brian Edginton NAME STORE INCLUDE DOS.MAC DSEG ; Register and stack storage structure follows. S STRUC RAX DW ? RBX DW ? RCX DW ? RDX DW ? RSI DW ? RDI DW ? RDS DW ? RCS DW ? RSS DW ? RES DW ? RIP DW ? ; Storage for 2 words RBP DW ? ; pushed for iret RFL DW ? ; and flags. RRT DW ? ; Return address ; pushed for call. S ENDS STORAGE S <0,0,0,0,0,0,0,0,0,0,0,0> ENDDS PSEG ; name - cpush() ; Pushes all the registers and segregs ; and flags onto the stack. Use with ; cpop() to restore in correct order. PUBLIC CPUSH IF LPROG CPUSH PROC FAR ELSE CPUSH PROC NEAR ENDIF POP STORAGE.RRT POP STORAGE.RIP ; SAVE RETI IP, POP STORAGE.RCS ; SAVE RETI CS, POP STORAGE.RFL ; SAVE THE FLAGS, MOV STORAGE.RAX,AX ; AND TUCK AWAY MOV STORAGE.RBX,BX ; ALL REGISTERS. MOV STORAGE.RCX,CX MOV STORAGE.RDX,DX MOV STORAGE.RDI,DI MOV STORAGE.RSI,SI MOV STORAGE.RDS,DS ; GET THE SEGMENT ; MOV STORAGE.RSS,SS ; REGISTERS. MOV STORAGE.RES,ES PUSH STORAGE.RRT ; PUT CALL RETURN ; ADDRESS ON STACK. RET CPUSH ENDP PUBLIC CPOP IF LPROG CPOP PROC FAR ELSE CPOP PROC NEAR ENDIF PUSH STORAGE.RFL ; RESTORE FLAGS. PUSH STORAGE.RCS ; RESTORE CS, PUSH STORAGE.RIP ; THEN IP. MOV ES,STORAGE.RES MOV DS,STORAGE.RDS MOV SI,STORAGE.RSI MOV DI,STORAGE.RDI MOV DX,STORAGE.RDX MOV CX,STORAGE.RCX MOV BX,STORAGE.RBX ; READY FOR IRET MOV AX,STORAGE.RAX ; WITH OLD IP AND IRET ; STUFF ON STACK. CPOP ENDP PUBLIC CPOPT IF LPROG CPOPT PROC FAR ELSE CPOPT PROC NEAR ENDIF PUSH STORAGE.RFL ; RESTORE FLAGS. PUSH STORAGE.RCS ; RESTORE CS, PUSH STORAGE.RIP ; THEN IP. MOV ES,STORAGE.RES MOV DS,STORAGE.RDS MOV SI,STORAGE.RSI MOV DI,STORAGE.RDI MOV DX,STORAGE.RDX MOV CX,STORAGE.RCX MOV BX,STORAGE.RBX ; READY FOR IRET MOV AX,STORAGE.RAX ; WITH OLD IP AND RET ; STUFF ON STACK. CPOPT ENDP ENDPS END